package com.ai.zhly.service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.ai.dmc.index.base.impl.base.BaseServiceImpl;
import com.ai.dmc.index.common.InitParam;
import com.ai.dmc.index.common.bean.AreaBean;
import com.ai.dmc.index.common.bean.JobBean;
import com.ai.dmc.index.common.cache.AreaCache;
import com.ai.frame.logger.Logger;
import com.ai.frame.logger.LoggerFactory;

import net.sf.json.JSONObject;
/**
* @Title: JobServiceImpl.java
* @Description: 角色管理---实现类
* @author xueyf3  
* @date 2016年5月23日 下午4:18:41
* Copyright：Copyright (c) 2016
* Company：北京亚信智慧数据科技有限公司
* @version V1.0
 */
public class JobUtilServiceImpl extends BaseServiceImpl implements IJobUtilService{
	// 定义对应Mapper文件的命名空间
    private static final String NAMESPACE = "Job.";
    
    public static Logger log = LoggerFactory.getServiceLog(JobUtilServiceImpl.class);
   
    
    /**
	 * 
	 * @Description : 新增的时候，判断jobId是否存在
	 * 
	 * @return Boolean
	 * 
	 * @author : wucm
	 * @date : 2015年11月13日 上午11:11:11
	 * 
	 */
    @Override
	public Boolean checkOnlyId(String jobId) {
		JobBean result = null;
		result = this.queryJob(jobId);

		if (result != null) {
			return false;
		}

		return true;
	}
    /**
	 * 
	 * @Description : 角色新增
	 * @param param
	 * @return
	 * @return Boolean
	 * 
	 * @author : wucm
	 * @date : 2015年8月4日 下午9:28:26
	 * 
	 */
    @Override
	public Boolean jobAdd(JobBean param) {
		try {
			this.getBaseDao().insert(NAMESPACE + "jobAdd", param);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	/**
	 * 
	 * @Description : 角色修改
	 * @param param
	 * @return
	 * @return Boolean
	 * 
	 * @author : wucm
	 * @date : 2015年8月4日 下午9:28:26
	 * 
	 */
    @Override
	public Boolean jobModify(JobBean param) {
		try {
			this.getBaseDao().insert(NAMESPACE + "jobUpdateInfo", param);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	/**
	 * 
	 * @Description : 查询角色
	 * @param userId
	 * @return
	 * @return JobBean
	 * 
	 * @author : wucm
	 * @date : 2015年8月11日 上午8:56:59
	 * 
	 */
    @Override
	public JobBean queryJob(String jobId) {
		JobBean jBean = null;

		List<JobBean> jList = this.queryJobList(null, true);

		for (JobBean j : jList) {
			if (null != jobId && jobId.equals(j.getJobId())) {
				jBean = j;
				break;
			}
		}

		return jBean;
	}
	/**
	 * 
	 * @Description : 查询角色列表--分页
	 * 
	 * @param isAdmin
	 * @param areaId
	 * @param curPage
	 * @param pageSize
	 * @param keyword
	 * 
	 * @return List<JobBean>
	 * 
	 * @author : wucm
	 * @date : 2015年8月3日 下午2:51:43
	 * 
	 */
    @Override
	public JSONObject queryJobList(Boolean isAdmin, String areaId,
			String curPage, String pageSize, String keyword) {
		JSONObject json = new JSONObject();

		List<JobBean> jList = this.queryJobList(areaId, isAdmin);

		// 关键字过滤
		if (null != keyword && keyword.length() > 0 && jList.size() > 0) {
			Iterator<JobBean> it = jList.iterator();
			while (it.hasNext()) {
				JobBean j = it.next();
				String jId = j.getJobId();
				String jName = j.getJobName();
				if (!jId.contains(keyword) && !jName.contains(keyword)) {
					it.remove();
				}
			}
		}

		// 数据处理
		json = toPage(jList, curPage, pageSize);

		return json;
	}
	
	/**
	 * 
	 * @Description : 查询角色列表
	 * 
	 * @param userAreaId
	 * @param isAdmin
	 * 
	 * @return List<JobBean>
	 * 
	 * @author : wucm
	 * @date : 2015年8月3日 下午2:51:43
	 * 
	 */
    @Override
	public List<JobBean> queryJobList(String userAreaId, Boolean isAdmin) {
		List<JobBean> jList = null;

		// 查询数据		
			
		jList = (ArrayList<JobBean>) this.getBaseDao().queryForList(NAMESPACE + "queryJobList",null, JobBean.class);
		
		if (null == jList) {
			jList = new ArrayList<JobBean>();
		}
		// 权限过滤
		if (!isAdmin) {
			Iterator<JobBean> it = jList.iterator();
			while (it.hasNext()) {
				JobBean j = it.next();
				if (!validateUserJobRight(j, userAreaId)) {
					it.remove();
				}
			}
		}

		// 地市全量信息
		Map<String, AreaBean> allMap = (Map<String, AreaBean>) AreaCache.areaCache
				.get(AreaBean.TYPE_ALL);

		// 添加归属地市
		Iterator<JobBean> it = jList.iterator();
		while (it.hasNext()) {
			JobBean j = it.next();
			String jaId = j.getAreaId();
			AreaBean ab = allMap.get(jaId);
			if (null != ab) {
				j.setAreaName(ab.getAreaName());
			}
		}

		return jList;
	}
	/**
	 * 
	 * @Description : 验证用户是否可以管理某个角色，根据用户的归属地
	 * 
	 * @return Boolean
	 * 
	 * @author : wucm
	 * @date : 2015年11月12日 下午7:58:10
	 * 
	 */
    @Override
	public Boolean validateUserJobRight(JobBean jobBean, String userAreaId) {
		String areaId = jobBean.getAreaId();

		if (InitParam.DEPLOY_PROVINCE_ID.equals(userAreaId)) {
			// 省级用户
			return true;
		} else {
			// 非省级用户
			// 非本地市的角色不能管理
			if (!areaId.contains(userAreaId)) {
				return false;
			}
		}

		return true;
	}
    
    /**
	 * 
	 * @Description : 将数据组织成分页数据
	 * @param data
	 * @param curPage
	 * @param pageSize
	 * @return
	 * @return JSONObject
	 * 
	 * @author : wucm
	 * @date : 2015年8月3日 下午3:10:21
	 * 
	 */
	public static JSONObject toPage(List<JobBean> data, String curPageParam,
			String pageSizeParam) {
		JSONObject result = new JSONObject();

		if (null == data) {
			data = new ArrayList<JobBean>();
		}

		int pageSize = pageSizeParam == null ? 100
				: Integer.parseInt(pageSizeParam);
		int curPage = curPageParam == null ? 1 : Integer.parseInt(curPageParam);

		// 总数据
		int total = data.size();// 总记录数
		int totalPage = total % pageSize == 0 ? total / pageSize
				: total / pageSize + 1;
		if (totalPage == 0) {
			totalPage++;
		}

		// 当前页不大于总页数
		if (curPage > totalPage) {
			curPage = totalPage;
		}

		// 分页数据
		int start = (curPage - 1) * pageSize;
		int max = start + pageSize > total ? total : start + pageSize;
		List<JobBean> curList = new ArrayList<JobBean>();
		for (int i = start; i < max; i++) {
			if (null == data.get(i)) {
				continue;
			}
			curList.add(data.get(i));
		}
		net.sf.json.JSONArray curData = net.sf.json.JSONArray
				.fromObject(curList);

		result.put("totalPage", totalPage);
		result.put("totalNumber", total);
		result.put("data", curData);
		result.put("curPage", curPage);
		result.put("pageSize", pageSize);
		return result;
	}
	
}
